#include <iostream>
#include <string>

using std::cout;
using std::endl;
using std::string;

void test()
{
    int a = 10;//栈上
    int b = 20;//栈上
    int *pflag = &a;
    string s1("hello");
    string s2("world");

    &a;//ok
    &b;//ok
    /* &(a + b);//error,表达式，没有名字 */
    &pflag;//ok
    &*pflag;//ok

    &s1;//ok
    &s2;//ok
    /* &(s1 + s2);//error, */

    string s3 = s1 + s2;
    &s3;//ok

    //非const的左值引用可以绑定到左值,但是不能绑定到右值
    int &ref = a;//ref是引用，也是左值引用
    /* int &ref2 = 10;//error */
    //const左值引用可以绑定到右值，
    const int &ref3 = 10;//ok
    //const左值引用可以绑定到左值，
    const int &ref4 = a;//ok

    //右值引用不能绑定到左值，但是可以绑定到右值，也就是
    //右值引用可以识别出右值
    /* int &&rref = a;//error */
    int &&rref1 = 10;//ok

    &rref1;//ok,此时，右值引用可以是左值
}

int &&func()
{
    return 10;
}

int main(int argc, char *argv[])
{
    test();

    /* &func();//右值引用也可以是右值 */
    return 0;
}

